package simpleGa;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * @author Wichrowski
 */
public class Populacja {

    private List<Osobnik> listOsobnikow;

    public Populacja() {
        listOsobnikow = new ArrayList<>();
        int i = 0;
        for (i = 0; i < Graf.liczbaWierzcholkow*100; i++) {
            listOsobnikow.add(new Osobnik(i, true));
        }
        System.out.println("listOsobnikow.size()=" + i);
    }

    public Osobnik getNajlepszy() {
        int najlepszaOcena = Graf.liczbaWierzcholkow;
        Osobnik genotypNajlepszy = listOsobnikow.get(Graf.liczbaWierzcholkow - 1);
        for (int i = 0; i < Graf.liczbaWierzcholkow; i++) {
            if (listOsobnikow.get(i).isPokrycieGrafu()) {
                int ocena = listOsobnikow.get(i).getOcena();
                if (ocena < najlepszaOcena) {
                    najlepszaOcena = ocena;
                    genotypNajlepszy = listOsobnikow.get(i);
                }
            }
        }
        return genotypNajlepszy;
    }

    public void wyswietlOceny() {

        for (int i = 0; i < Graf.liczbaWierzcholkow; i++) {
            Osobnik get = listOsobnikow.get(i);
            if (get.isPokrycieGrafu()) {
                System.out.println("osobnik " + i + " ocena = " + get.getOcena() + " jest pokryciem");
            } else {
                System.out.println("osobnik " + i + " ocena = " + get.getOcena());
            }

        }
    }

    public void krzyzowanie(Osobnik najlepszy) {
        List<Osobnik> listOsobnikow1 = new ArrayList<>();
        listOsobnikow1.add(najlepszy);
        for (int i = 1; i < Graf.liczbaWierzcholkow; i++) {
            Osobnik osobnikSkrzyzowany = new Osobnik(i, false);
            Osobnik osobnik1 = listOsobnikow.get(GA.losujLiczbe(Graf.liczbaWierzcholkow - 1));
            Osobnik osobnik2 = listOsobnikow.get(GA.losujLiczbe(Graf.liczbaWierzcholkow - 1));
            int pktKrzyzowania = GA.losujLiczbe(Graf.liczbaWierzcholkow);
            int[] genotyp = new int[Graf.liczbaWierzcholkow];
            for (int k = 0; k < pktKrzyzowania; k++) {
                genotyp[k] = osobnik1.getGenotyp()[k];
            }
            for (int k = pktKrzyzowania; k < Graf.liczbaWierzcholkow; k++) {
                genotyp[k] = osobnik2.getGenotyp()[k];
            }
            osobnikSkrzyzowany.setGenotyp(genotyp);
            listOsobnikow1.add(osobnikSkrzyzowany);
        }
        listOsobnikow = listOsobnikow1;
    }

    public void mutuj(Osobnik najlepszy, int k) {

        for (int i = 0; i < k; i++) {
            int pozycjaOsobnika = GA.losujLiczbe(Graf.liczbaWierzcholkow - 1);
            Osobnik get = listOsobnikow.get(pozycjaOsobnika);
            if (get.getId() != najlepszy.getId()) {
                int pozycja = GA.losujLiczbe(Graf.liczbaWierzcholkow - 2);
                int j1 = get.getGenotyp()[pozycja];
                int j2 = get.getGenotyp()[pozycja + 1];
                get.getGenotyp()[pozycja] = j2;
                get.getGenotyp()[pozycja + 1] = j1;
            }
            listOsobnikow.set(pozycjaOsobnika, get);
        }
    }

}
